/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.web.managedbeans;

import cl.bussines.entities.Permisos;
import cl.bussines.entities.Rol;
import cl.bussines.entities.RolHasPermisos;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;

/**
 *
 * @author Vogel
 */
@ManagedBean(name="rolMBean")
@SessionScoped
public class RolMBean extends BaseMBean{

    private static final String VISTA_LISTAR = "roles";
    private static final String VISTA_PERMISOS = "permisos";
    
    private List<Rol> roles;
    private List<Permisos> permisosOrigen;
    private List<Permisos> permisosDestino;
    private List<SelectItem> listaOrigen= new ArrayList<SelectItem>() ;
    private List<SelectItem> listaDestino = new ArrayList<SelectItem>() ;
    @EJB
    private cl.bussines.ejbs.RolFacade ejbFacade;
    @EJB
    private cl.bussines.ejbs.PermisosFacade ejbPermisos;
    @EJB
    private cl.bussines.ejbs.RolHasPermisosFacade ejbRelacion;
    private static Logger LOG = Logger.getLogger(RolMBean.class);
    private Rol rol = new Rol(0);  
    
    public String init(){
        return VISTA_LISTAR;
    }

     public String limpiar(){
        this.rol=new Rol(0);
        return VISTA_LISTAR;
    }
    public String delete(){
        try{
            int codigo = Integer.parseInt(getParam("codigo"));
            String index = getParam("index");

            LOG.info("Codigo del rol a editar ["+codigo+"]");
            LOG.info("Index de la tabla ["+index+"]");
            for(Rol oper : roles){ 
                if(oper.getIdRol()==codigo){
                    LOG.info("Entro a setear la rol;");
                    this.rol = oper;
                }
            }
            if(rol != null && rol.getIdRol()!=0){
                LOG.info("START::DELETE::");
                ejbFacade.remove(rol);
                message(FacesMessage.SEVERITY_INFO,"Ha eliminado correctamente.");
            }
            
            roles.clear();
        } catch (Exception e) {
            LOG.error(e);
            message(FacesMessage.SEVERITY_ERROR,"Error al eliminar rol.");
        }
        return VISTA_LISTAR;
    }
    
    public String volver(){
        roles.clear();
        rol = new Rol(0);
        return init();
    }
    
    public String guardar(){
        try{
            //SE EDITA ROL
            if(this.rol.getRol() != null && !this.rol.getRol().trim().equals("")){
                if(this.rol.getIdRol()!=0){
                    LOG.info("START::EDITAR::");
                    ejbFacade.edit(rol);
                    message(FacesMessage.SEVERITY_INFO,"Rol editado correctamente.");
                    this.rol=new Rol(0);
                }else{
                    if(this.rol.getIdRol()== null) this.rol.setIdRol(0);
                    LOG.info("START::CREATE::");
                    ejbFacade.create(rol);
                    message(FacesMessage.SEVERITY_INFO,"Ha sido creado correctamente.");
                    this.rol= new Rol(0);
                    roles = null;
                }
                roles.clear();
            }
        } catch (Exception e) {
            LOG.error(e);
            message(FacesMessage.SEVERITY_ERROR,"Error al guardar cambios.");
        }
        return VISTA_LISTAR;
    }
    
    public String irPermisos(){
        int codigo = Integer.parseInt(getParam("codigo"));
        String index = getParam("index");
        
        LOG.info("Codigo del rol a editar ["+codigo+"]");
        LOG.info("Index de la tabla ["+index+"]");
        LOG.info("roles size ["+roles.size()+"]");
        for(Rol oper : roles){ 
            if(oper.getIdRol()==codigo){
                LOG.info("Entro a setear la rol;");
                this.rol = oper;
            }
        }
        listaOrigen.clear();
        listaDestino.clear();
        
        setPermisosDestino(ejbPermisos.getPermisosByRol(rol));
        setPermisosOrigen(ejbPermisos.findAll());
      
        for(Permisos per :getPermisosDestino()){
            getPermisosOrigen().remove(per);
        }
        
        for(Permisos per : getPermisosOrigen()){
            SelectItem s = new SelectItem(per.getIdPermiso(),per.getPermiso());
            listaOrigen.add(s);
        }
        
        for(Permisos per : getPermisosDestino()){
            SelectItem s = new SelectItem(per.getIdPermiso(),per.getPermiso());
            listaDestino.add(s);
        }
        return VISTA_PERMISOS;
    }
    
    public String editarPermisos(){
    /**        
     * ACA LO QUE TENGO QUE HACER, ES ELIMINAR TODOS LOS REGISTROS DONDE
       EL ROL SEA EL SELECCIONADO
       * Y LUEGO INSERTAR LO QUE VENGA EN LA LISTA DE DESTINO
        */
       try{
           List<RolHasPermisos> rolHas = ejbRelacion.getPermisosByRol(rol);
        for(RolHasPermisos has : rolHas){
            ejbRelacion.remove(has);
        }
         List<Permisos> finalList = converter(listaDestino);
        for(Permisos item :finalList){
            RolHasPermisos per = new RolHasPermisos();
            per.setIdRol(rol);
            per.setIdPermiso(item);
            ejbRelacion.create(per);
        }
         message(FacesMessage.SEVERITY_INFO,"Ha sido creado correctamente.");
       }catch(Exception e){
            LOG.error(e);
            message(FacesMessage.SEVERITY_ERROR,"Error al guardar cambios.");
       }
        
        return VISTA_PERMISOS;
    }
    
    private List<Permisos> converter(List<SelectItem> listaDestino){
        List<Permisos> finalList = new ArrayList<Permisos>();
        for(SelectItem item :listaDestino){
           for(Permisos per : permisosOrigen){
               if(per.getIdPermiso().intValue() == item.getValue()){
                   finalList.add(per);
               }
           }
        }
        return finalList;
    }
    
    public String irEditar(){
        LOG.info("ID rol a editar ["+getParam("codigo")+"]");
        int codigo = Integer.parseInt(getParam("codigo"));
        String index = getParam("index");
        
        LOG.info("Codigo del rol a editar ["+codigo+"]");
        LOG.info("Index de la tabla ["+index+"]");
        LOG.info("roles size ["+roles.size()+"]");
        for(Rol oper : roles){ 
            if(oper.getIdRol()==codigo){
                LOG.info("Entro a setear la rol;");
                this.rol = oper;
            }
        }
        return VISTA_LISTAR;
    }
    
    public List<Rol> getRoles() {
        if(roles == null || roles.isEmpty()){
             roles = ejbFacade.findAll();
        }
        return roles;
    }

    public void setRoles(List<Rol> roles) {
        this.roles = roles;
    }

    public List<Permisos> getPermisosOrigen() {
        return permisosOrigen;
    }

    public void setPermisosOrigen(List<Permisos> permisosOrigen) {
        this.permisosOrigen = permisosOrigen;
    }

    public List<Permisos> getPermisosDestino() {
        return permisosDestino;
    }

    public void setPermisosDestino(List<Permisos> permisosDestino) {
        this.permisosDestino = permisosDestino;
    }

    public Rol getRol() {
        return rol;
    }

    public void setRol(Rol rol) {
        this.rol = rol;
    }

    public List<SelectItem> getListaOrigen() {
        return listaOrigen;
    }

    public void setListaOrigen(List<SelectItem> listaOrigen) {
        this.listaOrigen = listaOrigen;
    }

    public List<SelectItem> getListaDestino() {
        return listaDestino;
    }

    public void setListaDestino(List<SelectItem> listaDestino) {
        this.listaDestino = listaDestino;
    }

    
}
